package br.com.siscom.model.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.siscom.conexao.InterfacePool;
import br.com.siscom.model.bean.Funcionario;

public class FuncionarioDAO implements InterfaceFuncionarioDAO {

	private InterfacePool pool;
	
	public FuncionarioDAO(InterfacePool pool) {
		super();
		this.pool = pool;
	}

	@Override
	public void atualizar(Funcionario funcionario) throws SQLException {
		Connection con = null;
		try {
			con = pool.getConnection();
			PreparedStatement ps;
			String sqlAtualizar = "UPDATE funcionario SET  actotal = ?, auditoria = ?, bairro = ?, " +
					" cargo = ?, celular = ?, cep = ?, cidade = ?, comissao = ?, cpf = ?, departamento_codigo = ?, " +
					" email = ?, endereco = ?, estado = ?, fone = ?, login = ?, nome = ?, orgaorg = ?, " +
					" posse = ?, rg = ?, senha = ? WHERE codigo = ? ;";
			ps = con.prepareStatement(sqlAtualizar);
			
			setPreparedStatement(funcionario, ps);
			
			ps.executeUpdate();
			
			ps.close();
		}finally
		{
			pool.liberarConnection(con);
		}

	}

	@Override
	public void excluir(Integer codigo) throws SQLException {
		Connection con = null;
		try{
			con = pool.getConnection();
			PreparedStatement ps;
			String sqlDelete = "DELETE FROM funcionario WHERE codigo = ? ;";
			ps = con.prepareStatement(sqlDelete);
			ps.setInt(1, codigo);
			ps.executeUpdate();
			
			ps.close();
		}finally{
			pool.liberarConnection(con);
		}
	}

	@Override
	public Funcionario getFuncionario(Integer codigo) throws SQLException {
		Funcionario funcionario = null;
		Connection con = null;
		try {
			con = pool.getConnection();
			PreparedStatement ps;
			String sqlSelect ="SELECT * FROM funcionario WHERE codigo = ? ;";
			ps = con.prepareStatement(sqlSelect);
			ps.setInt(1, codigo);
			ResultSet rs = ps.executeQuery();
			
			List<Funcionario> resultado = getListaFuncionarios(rs);
			if(resultado.size() > 0 )
				funcionario = resultado.get(0);
			
			rs.close();
			ps.close();
		}finally
		{
			pool.liberarConnection(con);
		}
		return funcionario;
	}

	@Override
	public Funcionario getFuncionario(String login) throws SQLException {
		Funcionario funcionario = null;
		Connection con = null;
		try {
			con = pool.getConnection();
			PreparedStatement ps;
			String sqlSelect ="SELECT * FROM funcionario WHERE login = ? ;";
			ps = con.prepareStatement(sqlSelect);
			ps.setString(1, login);
			ResultSet rs = ps.executeQuery();
			
			List<Funcionario> resultado = getListaFuncionarios(rs);
			if(resultado.size() > 0 )
				funcionario = resultado.get(0);
			
			rs.close();
			ps.close();
		}finally
		{
			pool.liberarConnection(con);
		}
		return funcionario;	
	}

	@Override
	public List<Funcionario> getFuncionarios() throws SQLException {
		
		List<Funcionario> resultado = null;

		Connection con = null;
		try {
			con = pool.getConnection();
			PreparedStatement ps;
			String sqlSelect = "SELECT * FROM funcionario;";
 
			ps = con.prepareStatement(sqlSelect);
			ResultSet rs = ps.executeQuery();
			
			resultado = getListaFuncionarios(rs);
			
			rs.close();
			ps.close();
		} finally
		{
			pool.liberarConnection(con);	
		}
		return resultado;
	}

	private List<Funcionario> getListaFuncionarios(ResultSet rs)
			throws SQLException {
		List<Funcionario> resultado = new ArrayList<Funcionario>();
		while(rs.next())
		{
			Funcionario funcionario = new Funcionario();
			funcionario.setActotal(rs.getString("actotal"));
			funcionario.setAuditoria(rs.getString("auditoria"));
			funcionario.setBairro(rs.getString("bairro"));
			funcionario.setCargo(rs.getString("cargo"));
			funcionario.setCelular(rs.getString("celular"));
			funcionario.setCep(rs.getString("cep"));
			funcionario.setCidade(rs.getString("cidade"));
			funcionario.setCodigo(rs.getInt("codigo"));
			funcionario.setComissao(rs.getDouble("comissao"));
			funcionario.setCpf(rs.getString("cpf"));
			funcionario.setDepartamento_codigo(rs.getInt("departamento_codigo"));
			funcionario.setEmail(rs.getString("email"));
			funcionario.setEndereco(rs.getString("endereco"));
			funcionario.setEstado(rs.getString("estado"));
			funcionario.setFone(rs.getString("fone"));
			funcionario.setLogin(rs.getString("login"));
			funcionario.setNome(rs.getString("nome"));
			funcionario.setOrgaorg(rs.getString("orgaorg"));
			funcionario.setPosse(rs.getDate("posse"));
			funcionario.setRg(rs.getString("rg"));
			funcionario.setSenha(rs.getString("senha"));
			resultado.add(funcionario);
		}
		return resultado;
	}

	@Override
	public void salvar(Funcionario funcionario) throws SQLException {
		Connection con = pool.getConnection();
		PreparedStatement ps;
		
		String sqlInsert = "INSERT INTO funcionario (actotal, auditoria, bairro, cargo, " +
				" celular, cep, cidade, comissao, cpf, departamento_codigo, email, endereco," +
				" estado, fone, login, nome, orgaorg, posse, rg, senha, codigo" +
				" ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, " +
				" ?, ?, ?); ";
		
		try {
			ps = con.prepareStatement(sqlInsert);
			
			setPreparedStatement(funcionario, ps);

			ps.executeUpdate();
			ps.close();
		} finally{
			pool.liberarConnection(con);
		}
	}

	private void setPreparedStatement(Funcionario funcionario,
			PreparedStatement ps) throws SQLException {
		ps.setString(1, funcionario.getActotal());
		ps.setString(2, funcionario.getAuditoria());
		ps.setString(3, funcionario.getBairro());
		ps.setString(4, funcionario.getCargo());
		ps.setString(5, funcionario.getCelular());
		ps.setString(6, funcionario.getCep());
		ps.setString(7, funcionario.getCidade());
		ps.setDouble(8, funcionario.getComissao());
		ps.setString(9, funcionario.getCpf());
		ps.setInt(10, funcionario.getDepartamento_codigo());
		ps.setString(11, funcionario.getEmail());
		ps.setString(12, funcionario.getEndereco());
		ps.setString(13, funcionario.getEstado());
		ps.setString(14, funcionario.getFone());
		ps.setString(15, funcionario.getLogin());
		ps.setString(16, funcionario.getNome());
		ps.setString(17, funcionario.getOrgaorg());
		ps.setDate(18, funcionario.getPosse());
		ps.setString(19, funcionario.getRg());
		ps.setString(20, funcionario.getSenha());
		ps.setObject(21, funcionario.getCodigo());
	}

}
